home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / basic / qbcref.com / CTRLCRTN.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-04-30  |  1.9 KB  |  51 lines

  1. #include <stdio.h>
  2. #include <dos.h>
  3. #define CTRLC_CHECK     0x33                /* CtrlC Check Interrupt */
  4. #define CTRLC_INTERRUPT 0x23                /* CtrlC Handler */
  5.  
  6. static void (interrupt far *BasicRtn)();    /* save ctrl/c routine address */
  7.  
  8. static void interrupt far CtrlCAbort(void) {    /* Ctrl C Comes Here */
  9.  
  10.     extern pascal far B$CEND();             /* basic end routine */
  11.     extern pascal far B$CENP();             /* basic end routine */
  12.  
  13.     char *msg = "Program Aborted..\n";
  14.  
  15.     write(1, msg, strlen(msg));             /* tell about abort */
  16.     B$CEND();                                /* call basic finish up */
  17.     B$CENP();                                /* call basic end */
  18.  
  19. }
  20.  
  21. static void pascal far CtrlCTrap (void) {
  22.  
  23.     _disable();                                 /* turn of interrupts */
  24.     _dos_setvect(CTRLC_INTERRUPT, BasicRtn);    /* restore old Ctrl/C */
  25.     _enable();                                  /* turn on interrupts */
  26.  
  27. };
  28.  
  29. /*************************************************************************
  30.  Function:SetCtrlC
  31.  Purpose :Setup Trap on CTRL/C key and abort
  32.  Inputs  :None
  33.  Outputs :None
  34.  Results :Restores Default CTRL/C Interrupt
  35. **************************************************************************/
  36.  
  37. void pascal far SetCtrlC (void) {
  38.  
  39.     extern pascal far B_OnExit();               /* address of basic exit */
  40.     union REGS r;                               /* registers for call */
  41.  
  42.     _disable();                                 /* turn of interrupts */
  43.     BasicRtn = _dos_getvect(CTRLC_INTERRUPT);   /* save old intr address */
  44.     _dos_setvect(CTRLC_INTERRUPT, CtrlCAbort);  /* set new interrupt */
  45.     B_OnExit(CtrlCTrap);                        /* tell basic about exit rtn */
  46.     _enable();                                  /* turn on interrupts */
  47.     r.h.ah = CTRLC_CHECK;                       /* ctrl-c check interrupt */
  48.     r.h.al = r.h.dl = 0x01;                     /* set function */
  49.     intdos(&r, &r);                             /* perform dos call */
  50. }
  51.